package com.warm.base.jdk.thread.base;


import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * CAS: Compare and swap -- jdk 提供的非阻塞原子性操作，通过硬件保证 比较-更新 操作的原子性
 *
 *   CAS ABA 问题：AtomicStampedReference 类给每个变量配备了一个时间戳，避免 ABA 问题
 *
 * Unsafe: 硬件级别的原子性操作
 */
public class TestUnsafe {

    static final Unsafe unsafe;

    static final long stateOffSet;

    private volatile long state = 0;

    static {
        try {
            // Unsafe 是使用 Bootstrap 加载器加载的, main 函数是 AppClassLoader 加载的, 这里需要用 反射 来获取 Unsafe 成员变量 theUnsafe
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);

            // 获取该变量的值
            unsafe = (Unsafe) field.get(null);

            // 获取 state 偏移量
            stateOffSet = unsafe.objectFieldOffset(TestUnsafe.class.getDeclaredField("state"));
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
            throw new Error(e);
        }
    }

    public static void main(String[] args) {
        TestUnsafe test = new TestUnsafe();

        // compareAndSwapInt(对象内存位置, 偏移量, 预期值, 更新值)
        // 对象内存位置 + 偏移量 = 预期值 --> 更新变量为 更新值
        boolean b = unsafe.compareAndSwapLong(test, stateOffSet, 0, 2);
        System.out.println(test.state);
        System.out.println(b);
    }
}
